--- title: "10-VPS Docker 部署完整指南" created: 2026-01-03 tags: - 项目筑基 --- # VPS Docker 部署完整指南 > 基于 NAT VPS 的全 Docker 化部署方案 - 稳定、易迁移、可备份 > > ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/image-4d73d932.png]]![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/image-e0b6cd43.png]] --- ## 服务器配置 **硬件资源** - 内存: 4GB (当前仅用 175MB,资源充足) - 架构: x86\_64 (兼容性极佳) - 系统: Ubuntu 22.04 LTS 配置远超"中转站"需求,完全可以作为轻量级云端应用中心 --- ## 核心理念 ### 为什么选择 Docker 化? 1. **方便迁移**: 所有配置都在文件夹里,打包即可换服务器 2. **环境隔离**: 不污染系统,不会依赖冲突 3. **快速恢复**: 备份 + 一行命令 = 原地复活 4. **资源高效**: 容器共享内核,比虚拟机轻量 ### NAT VPS 生存法则 1. **数据挂载**: 必须把数据目录挂载到宿主机 2. **自动备份**: 定期备份到云盘,防止商家跑路 3. **避免高带宽应用**: 不跑影视库、大流量下载器 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450816879-1671aae5.png]] ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450958591-e962fa93.png]] --- ## 基础环境搭建 ### 1. 换源并安装 Docker ``` # 换源 (一路回车) bash <(curl -sSL https://linuxmirrors.cn/main.sh) --source aliyun # 强制改成阿里云源 cat > /etc/apt/sources.list < /etc/resolv.conf echo "nameserver 1.1.1.1" >> /etc/resolv.conf # 测试网络 ping -c 3 archive.ubuntu.com # 更新软件源 apt update # 安装 Docker apt install -y ca-certificates curl gnupg lsb-release mkdir -p /etc/apt/keyrings curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 验证安装 docker --version docker compose version # 启动并设置开机自启 systemctl start docker systemctl enable docker ``` ### 2. 配置 Docker 镜像加速 ``` mkdir -p /etc/docker cat > /etc/docker/daemon.json <> $LOG_FILE # 重启服务 systemctl restart cloudflared # 等待 10 秒再次检查 sleep 10 NEW_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$TEST_URL") echo "[$NOW] ✅ 重启完成,当前状态码: $NEW_CODE" >> $LOG_FILE else # 正常情况下不写日志,以免撑爆硬盘 : fi ``` ### 2. 赋予执行权限 ``` chmod +x /opt/check_tunnel.sh ``` ### 3. 手动测试 ``` /opt/check_tunnel.sh ``` - 无输出: 网站正常运行 - 有输出: 脚本正在尝试重启服务 ### 4. 加入定时任务 每 5 分钟自动检查一次: ``` crontab -e ``` 在文件最后添加: ``` */5 * * * * /opt/check_tunnel.sh ``` 保存退出 (Ctrl+X → Y → Enter) ### 5. 查看日志 查看看门狗的工作记录: ``` cat /var/log/tunnel_watchdog.log ``` **效果**: 当网站无法访问时,最多等待 5 分钟,看门狗会自动重启 Cloudflare Tunnel 服务 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449055454-a55bc9b1.png]] --- ## 三件套部署 > 「三件套」即 [[05-极简三剑客 Dockge + FileBrowser|极简三剑客]] 篇的三位主角(Dockge + FileBrowser + Uptime Kuma),本节为部署完成后的汇总参考版;当时的逐步实操记录见三剑客篇。 ### 1. Dockge (容器管理) **特点**: 将 docker-compose.yml 可视化,方便管理和迁移 ``` cd /opt/dockge # 下载配置 curl -L https://ghproxy.net/https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml # 启动 docker compose up -d ``` **Cloudflare Tunnel 配置**: - Subdomain: `docker` - URL: `10.10.10.1:5001` - 访问: `https://docker.hxnppll.top` **登录信息**: - 账号: wei - 密码: zw200495 --- ### 2. FileBrowser (文件管理) **特点**: Web 端管理 VPS 所有文件,支持上传/下载/编辑 在 Dockge 中新建 Stack,Name: `filebrowser` ```yaml version: '3.3' services: filebrowser: image: filebrowser/filebrowser:latest container_name: filebrowser user: 0:0 # root权限 ports: - 8081:80 volumes: - /:/srv # 挂载整个根目录 - /opt/docker_data/filebrowser/filebrowser.db:/database.db - /opt/docker_data/filebrowser/settings.json:/.filebrowser.json restart: unless-stopped ``` **Cloudflare Tunnel 配置**: - Subdomain: `file` - URL: `10.10.10.1:8081` - 访问: `https://file.hxnppll.top` **初始密码**: ``` docker logs filebrowser # 查看初始密码 ``` 修改为: zw200495200495 --- ### 3. Uptime Kuma (系统监控) **特点**: 监控服务存活状态,SSL 证书过期提醒 在 Dockge 中新建 Stack,Name: `uptime-kuma` ```yaml version: '3.3' services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma volumes: - /opt/docker_data/uptime-kuma:/app/data - /var/run/docker.sock:/var/run/docker.sock # 监控容器状态 ports: - 3001:3001 restart: always ``` **Cloudflare Tunnel 配置**: - Subdomain: `status` - URL: `localhost:3001` - 访问: `https://status.hxnppll.top` **登录信息**: - 账号: wei - 密码: zw200495 --- ## 备份与恢复 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449918508-fe1d5f76.png]] ### 备份架构 ``` 每天 21:00 自动执行 ↓ 打包 /opt/stacks + /opt/dockge + /opt/docker_data ↓ 通过 Rclone 同步到家庭 Alist ↓ 清理 7 天前的旧备份 ``` ### 1. 部署 Rclone 在 Dockge 中新建 Stack,Name: `rclone-backup` ```yaml version: '3.8' services: rclone: image: rclone/rclone:latest container_name: rclone restart: unless-stopped volumes: - /opt/docker_data/rclone/config:/config/rclone - /opt/backup:/data/backup environment: - PHP_TZ=Asia/Shanghai - PUID=0 - PGID=0 command: rcd --rc-web-gui --rc-addr :5572 --rc-user admin --rc-pass admin ports: - 5572:5572 ``` ### 2. 配置 Rclone (连接家庭 Alist) ``` # 进入容器配置 docker exec -it rclone rclone config # 交互配置步骤 n # 新建 home_alist # 名称 webdav # 类型 http://10.10.10.2:5244/dav # URL (EasyTier内网) other # Vendor [输入Alist用户名] # User y → [输入密码] # Password n # 跳过高级配置 y # 确认 q # 退出 # 验证连接 docker exec rclone rclone lsd home_alist:/ ``` ### 3. 创建备份脚本 ``` nano /opt/backup_docker.sh ``` 写入内容: ``` #!/bin/bash # 配置区 BACKUP_DIR="/opt/backup" DATE=$(date +%Y%m%d) FILENAME="docker_backup_$DATE.tar.gz" RCLONE_REMOTE="home_alist" REMOTE_DIR="/D:/vps_backup" # 准备目录 mkdir -p $BACKUP_DIR echo "[$(date)] 开始备份..." # 打包核心数据 echo "[$(date)] 正在打包文件..." tar -czf $BACKUP_DIR/$FILENAME /opt/stacks /opt/dockge /opt/docker_data # 检查打包结果 if [ $? -eq 0 ]; then echo "[$(date)] 打包成功: $FILENAME" else echo "[$(date)] 打包失败!" exit 1 fi # 同步到远程 echo "[$(date)] 正在同步到远程家庭主机..." docker exec rclone rclone copy /data/backup/$FILENAME $RCLONE_REMOTE:$REMOTE_DIR # 清理 7 天前的旧备份 echo "[$(date)] 清理旧备份..." find $BACKUP_DIR -name "docker_backup_*.tar.gz" -mtime +7 -exec rm {} \; echo "[$(date)] 全部完成!" ``` 赋予权限并测试: ``` chmod +x /opt/backup_docker.sh /opt/backup_docker.sh ``` ### 4. 设置定时任务 ```bash # 编辑定时任务 crontab -e # 添加每天 21:00 执行 0 21 * * * /opt/backup_docker.sh # 修正时区 (可选) sudo timedatectl set-timezone Asia/Shanghai ``` ### 5. 灾难恢复流程 当 VPS 损坏或更换服务器时: ``` # 1. 新 VPS 安装 Docker curl -fsSL https://get.docker.com | bash apt install tar # 2. 上传备份文件到根目录后解压 tar -xzf docker_backup_xxx.tar.gz -C / # 3. 启动 Dockge cd /opt/dockge docker compose up -d # 4. 在 Dockge 面板中点击 Update 或 Start 恢复所有容器 ``` --- ## 静态网页托管 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767450333348-ed2d52c2.png]] ### 核心理念 **不需要安装 Nginx 软件**,而是用 Nginx Docker 容器托管网页 **角色分工**: - Cloudflare Tunnel: 对外大门 (域名、SSL、端口转发) - Docker Nginx: 内部文件分发 ### 目录结构 ``` /opt/docker_data/nginx_pro/ ├── conf/ │ └── default.conf # 核心配置 └── html/ # 网页仓库 ├── love/ # 站点1 └── resume/ # 站点2 ``` ### Nginx 配置 (default.conf) ``` # 站点 1: Love server { listen 80; server_name love.hxnppll.top; location / { root /usr/share/nginx/html/love; index index.html index.htm; } } # 站点 2: Resume server { listen 80; server_name resume.hxnppll.top; location / { root /usr/share/nginx/html/resume; index index.html index.htm; } } # 默认兜底 server { listen 80 default_server; server_name _; return 404; } ``` ### Dockge 部署 Name: `nginx-pro` ```yaml version: '3.8' services: nginx-pro: image: nginx:alpine container_name: nginx-pro restart: always ports: - 8037:80 volumes: - /opt/docker_data/nginx_pro/html:/usr/share/nginx/html - /opt/docker_data/nginx_pro/conf/default.conf:/etc/nginx/conf.d/default.conf ``` ### Cloudflare Tunnel 配置 所有子域名都指向同一端口,让 Nginx 自己分拣: | Subdomain | Service URL | 说明 | | --- | --- | --- | | love | http://nginx-pro:80 | Love 主页 | | resume | http://nginx-pro:80 | 简历页 | ### 维护命令 ``` # 修改 HTML 文件: 无需重启,刷新浏览器即可 # 修改 default.conf 后重载配置 docker exec -it nginx-pro nginx -s reload ``` --- ## 扩展应用 ### 镜像导入流程 (国内网络限制) ```bash # Windows 下载并打包 docker pull [镜像名] docker save -o D:\xxx.tar [镜像名] # 上传到 VPS 后导入 docker load -i /opt/xxx.tar # Dockge 配置中添加 pull_policy: never # 强制使用本地镜像 ``` ### 1. Homarr (个人仪表盘) **特点**: 漂亮的导航页,集成 Docker 容器状态 Windows 下载: ```bash docker pull ghcr.io/ajnart/homarr:latest docker save -o D:\homarr.tar ghcr.io/ajnart/homarr:latest ``` VPS 终端: 把 `homarr.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/homarr.tar ``` Dockge 配置: ```yaml services: homarr: image: ghcr.io/ajnart/homarr:latest pull_policy: never container_name: homarr volumes: - /opt/docker_data/homarr/configs:/app/data/configs - /opt/docker_data/homarr/icons:/app/public/icons - /var/run/docker.sock:/var/run/docker.sock ports: - 7575:7575 restart: unless-stopped ``` - **Cloudflare**: `home` -> `localhost:7575` - **玩法**:以后浏览器主页就设成 `https://home.hxnppll.top`,一站式直达所有服务。 --- ### 2. Linkding (书签管理) **特点**: 极简书签服务,支持标签和稍后阅读 **Windows 下载**: ```bash docker pull sissbruecker/linkding:latest docker save -o D:\linkding.tar sissbruecker/linkding:latest ``` VPS 终端: 把 `linkding.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/linkding.tar ``` **Dockge 配置**: ```yaml services: linkding: image: sissbruecker/linkding:latest pull_policy: never container_name: linkding volumes: - /opt/docker_data/linkding:/etc/linkding/data ports: - 9090:9090 restart: unless-stopped ``` **Cloudflare**: `mark` -> `localhost:9090` **访问**: `mark.hxnppll.top` --- ### 3. Excalidraw (在线画图 可多人同步协作) **概述:** - **功能**:手绘风格白板工具,支持多人实时协作。 - **架构**:前端 (绘图界面) + 后端 (Room 协作服务)。 - **局限**:开源版默认不带数据库存储,刷新后数据丢失,需手动保存 `.excalidraw` 文件到本地。 #### 第一步:获取源码 (在 Windows 本地) 你需要先有 git 环境,或者直接去 GitHub 下载 ZIP 包。 **克隆仓库:** 打开 gitbash: ```bash git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 git clone https://github.com/excalidraw/excalidraw.git cd excalidraw ``` #### 第二步:修改配置文件 (最关键的一步) 在项目根目录下,修改 `.env.production`为: **文件内容 (.env.production):** ```properties # 1. 生产模式 MODE="production" NODE_ENV="production" # 2. 你的后端协作地址 (WebSocket) - 必须填对 # 这是实现“看着别人画”的关键 VITE_APP_WS_SERVER_URL=wss://draw-room.hxnppll.top # 3. 存储后端 (HTTP) # 虽然 excalidraw-room 镜像存不了文件,但填上你自己的地址 # 可以防止前端去请求官方服务器报错跨域 VITE_APP_BACKEND_V2_GET_URL=https://draw-room.hxnppll.top/api/v2/room VITE_APP_BACKEND_V2_POST_URL=https://draw-room.hxnppll.top/api/v2/room # 4. 禁用 Firebase (彻底切断 Google 依赖) VITE_APP_FIREBASE_CONFIG= # 5. 其他杂项 (保持默认或关闭) VITE_APP_ENABLE_TRACKING=false VITE_APP_ENABLE_SENTRY=false ``` **注意:** 必须使用 `VITE_` 开头,Excalidraw 现已全面迁移到 Vite 构建工具。 域名替换成你自己的将要设置的 #### 第三步:构建 Docker 镜像 Excalidraw 根目录自带了 `Dockerfile`,我们直接用它构建。 在 `excalidraw` 文件夹下执行: ```bash # -t 后面是你给镜像起的名字,点(.)代表当前目录 docker build -t my-excalidraw:latest . ``` **提示**:这一步会比较慢(大约 5-10 分钟),因为它需要下载 Node.js 依赖并进行编译(Nginx + 静态资源打包)。请耐心等待直到出现 `Successfully tagged my-excalidraw:latest`。 #### 第四步:导出并上传到 VPS 构建完成后,这个镜像现在只存在于 Windows 电脑上。需要把它搬运到 VPS。 另外,后端也需要拉取,由于网络原因,建议在本地下载好镜像后上传至 VPS。 **1. Windows 终端 (PowerShell)** ```bash # --- 1. 导出前端 --- docker save -o D:\my-excalidraw.tar my-excalidraw:latest # --- 2. 下载并导出后端 (协作服务) --- docker pull excalidraw/excalidraw-room:latest docker save -o D:\draw-room.tar excalidraw/excalidraw-room:latest ``` **2. VPS 终端 (SSH)** 将 `D:\my-excalidraw.tar` 和 `D:\draw-room.tar` 上传到 VPS 的 `/opt` 目录,然后导入: ``` docker load -i /opt/my-excalidraw.tar docker load -i /opt/draw-room.tar ``` #### 第五步:Dockge 配置 ``` version: '3.8' services: # --- 1. 你的专属前端 --- excalidraw-frontend: # 必须填你刚才构建的名字 image: my-excalidraw:latest #告诉 Docker 不要去网上拉,只用本地导入的这个 pull_policy: never container_name: excalidraw-web restart: unless-stopped ports: # 左边是 VPS 端口,可以根据需要修改,比如 5002 - 5002:80 depends_on: - excalidraw-room # --- 2. 协作后端 (不需要自己构建,用官方的即可) --- excalidraw-room: image: excalidraw/excalidraw-room:latest # 后端我们也导入了,也设置 never 防止它去网上乱拉 pull_policy: never container_name: excalidraw-room restart: unless-stopped ports: # 左边是 VPS 端口,对应 Nginx 反代的目标端口 - 5003:80 environment: - ALLOWED_ORIGINS=* ``` *点击 Deploy。* #### **第六步:配置 Cloudflare (两个域名)** 需要两个子域名,一个给界面看,一个给协作数据走。 1. **界面域名** (`draw.hxnppll.top`): - Subdomain: `draw` - URL: `localhost:5002` 2. **后端域名** (`draw-room.hxnppll.top`) - Subdomain: `draw-room` - URL: `localhost:5003` #### **第七步:测试协作** 1. 用浏览器打开 `https://draw.hxnppll.top`。 2. 点击左上角的“协作”按钮(两个人头图标)。 3. 点击“开始会话”。 4. 如果**没有报错**,且生成了一个链接,说明连接后端成功! 5. 把链接发给手机或者另一个浏览器,试试能不能看到对方的鼠标移动。 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/PixPin_2026-01-04_03-52-11-cb7682be.gif]] --- ### 4. Stirling-PDF (PDF 工具箱) **特点**: 支持合并、拆分、转 Word、OCR 等 **Windows 下载**: ```bash docker pull frooodle/s-pdf:latest docker save -o D:\spdf.tar frooodle/s-pdf:latest ``` **VPS 导入**: 把 `spdf.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/spdf.tar ``` **Dockge 配置**: ```yaml services: stirling-pdf: image: frooodle/s-pdf:latest pull_policy: never ports: - 8087:8080 environment: - DOCKER_ENABLE_SECURITY=false restart: unless-stopped ``` **Cloudflare**: `pdf` -> `localhost:8087` **访问**: `pdf.hxnppll.top` --- ### 5. IT-Tools (开发工具集) **Windows 下载**: ```bash docker pull corentinth/it-tools:latest docker save -o D:\it-tools.tar corentinth/it-tools:latest ``` **VPS 导入**: 把 `it-tools.tar` 上传到 VPS 的 `/opt`。 ``` # 导入 IT-Tools docker load -i /opt/it-tools.tar ``` **Dockge 配置**: ```yaml services: it-tools: image: corentinth/it-tools:latest pull_policy: never container_name: it-tools restart: unless-stopped ports: - 8085:80 ``` **Cloudflare**: `tools`-> `localhost:8085` **访问**: `tools.hxnppll.top` --- ### 6. Pingvin Share (文件分享) **Windows 下载**: ```bash docker pull stonith404/pingvin-share:latest docker save -o D:\pingvin.tar stonith404/pingvin-share:latest ``` **VPS 导入**: 把 `pingvin.tar` 上传到 VPS 的 `/opt`。 ``` # 导入 Pingvin Share docker load -i /opt/pingvin.tar ``` **Dockge 配置**: ```yaml services: pingvin-share: image: stonith404/pingvin-share:latest pull_policy: never restart: unless-stopped ports: - 3000:3000 volumes: - /opt/docker_data/pingvin/data:/opt/app/backend/data - /opt/docker_data/pingvin/images:/opt/app/frontend/public/img ``` **Cloudflare**: `share`-> `localhost:3000` **访问**: `share.hxnppll.top` --- ### 7. VoceChat (私人聊天室) **特点**: 超轻量,支持文字、图片、文件、语音 **Windows 下载**: ```bash docker pull privoce/vocechat-server:latest docker save -o D:\vocechat.tar privoce/vocechat-server:latest ``` **VPS 导入**: 把 `vocechat.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/vocechat.tar ``` **Dockge 配置**: ```yaml services: vocechat: image: privoce/vocechat-server:latest pull_policy: never container_name: vocechat ports: - 3009:3000 volumes: - /opt/docker_data/vocechat:/home/vocechat-server/data restart: unless-stopped ``` **Cloudflare**: `chat`-> `localhost:3009` **访问**: `chat.hxnppll.top` --- ### 8. MicroBin (极简剪贴板) **Windows 下载**: ```bash docker pull danielszabo99/microbin:latest docker save -o D:\microbin.tar danielszabo99/microbin:latest ``` **VPS 导入**: 把 `microbin.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/microbin.tar ``` **Dockge 配置**: ```yaml services: microbin: image: danielszabo99/microbin:latest pull_policy: never container_name: microbin ports: - 8086:8080 volumes: - /opt/docker_data/microbin:/app/microbin_data restart: unless-stopped ``` **Cloudflare**: `paste` -> `localhost:8086` **访问**: `paste.hxnppll.top` --- ### 9. EasyImage (简单图床) **特点**: 轻量、无需数据库、支持 WebP 转换 **Windows 下载**: ```bash # 1. 拉取镜像 docker pull ddsderek/easyimage:latest # 2. 导出 docker save -o D:\easyimage.tar ddsderek/easyimage:latest ``` **VPS 导入**: 把 `easyimage.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/easyimage.tar ``` **Dockge 配置**: ```yaml version: '3.3' services: easyimage: image: ddsderek/easyimage:latest pull_policy: never container_name: easyimage ports: - 8091:80 environment: - TZ=Asia/Shanghai - PUID=0 - PGID=0 volumes: - /opt/docker_data/easyimage/config:/app/web/config - /opt/docker_data/easyimage/i:/app/web/i restart: unless-stopped ``` **Cloudflare**: `img`-> `localhost:8091` **访问**: `img.hxnppll.top` ### **10.Navidrome** (音乐流媒体服务器) **用途**: 自建音乐库,支持 Subsonic/Airsonic API **Windows 下载:** ```bash docker pull deluan/navidrome:latest docker save -o D:\navidrome.tar deluan/navidrome:latest ``` **VPS 导入**: 把 `navidrome.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/navidrome.tar ``` **Dockge 配置:** ```yaml services: navidrome: image: deluan/navidrome:latest pull_policy: never container_name: navidrome ports: - 4533:4533 volumes: - /opt/docker_data/navidrome:/data # 需要挂载你的音乐目录 environment: - ND_LOGLEVEL=info restart: unless-stopped ``` **Cloudflare:** `music.hxnppll.top` → `localhost:4533` ### **11.Vaultwarden** (密码管理器) **用途**: Bitwarden 的轻量级替代,全平台密码同步 **Windows 下载:** ```bash docker pull vaultwarden/server:latest docker save -o D:\vaultwarden.tar vaultwarden/server:latest ``` **VPS 导入**: 把 `vaultwarden.tar` 上传到 VPS 的 `/opt`。 ``` docker load -i /opt/vaultwarden.tar ``` **Dockge 配置:** ```yaml services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped # 强制使用默认网桥,不创建新网络,节省 IP 资源 network_mode: bridge ports: - 8098:80 volumes: - /opt/docker_data/vaultwarden:/data environment: - WEBSOCKET_ENABLED=true - SIGNUPS_ALLOWED=true ``` **Cloudflare:** `password.hxnppll.top` → `localhost:8080` **重要**: 注册完账号后建议关闭注册(`SIGNUPS_ALLOWED=false`) ### 12.ChatGPT-Next-Web (AI 聊天 UI) - **作用**: 一个漂亮的网页版 ChatGPT 客户端。 - **优势**: 只需要填 Key,数据存在浏览器本地,支持预设面具(翻译官、润色师),支持多端同步。 - **架构特点**: 针对 NAT VPS 网络环境优化,使用 Host 模式 + 优化 API 线路。 **Windows 下载:** ```bash # 拉取镜像 docker pull yidadaa/chatgpt-next-web:latest # 导出为 tar 包 docker save -o D:\chatgpt-next-web.tar yidadaa/chatgpt-next-web:latest ``` **VPS 导入**: 把 `chatgpt-next-web.tar` 上传到 VPS 的 `/opt`。 ``` # 导入 ChatGPT 镜像 docker load -i /opt/chatgpt-next-web.tar ``` **部署配置 (Dockge):** - `network_mode: host`: 解决容器在 NAT VPS 无法连接外网的问题。 - `HOSTNAME=0.0.0.0`: 解决 Ubuntu 系统下 Host 模式监听 IP 异常导致 Cloudflare 连不上的问题。 - `BASE_URL`: 更换为 `apic1.ohmycdn.com`,解决 VPS IP 被 API 服务商阻断/超时的问题。 ``` version: "3.9" services: chatgpt-next-web: image: yidadaa/chatgpt-next-web:latest container_name: chatgpt-next-web pull_policy: never # 使用 host 模式,解决网络连通性问题 network_mode: host environment: - HOSTNAME=0.0.0.0 - OPENAI_API_KEY=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 - CODE=zw200495 # 去掉结尾的 /v1,防止出现双重 /v1/v1 路径 - BASE_URL=https://apic1.ohmycdn.com - CUSTOM_MODELS=-all,+gpt-5.2,+claude-opus-4-5,+claude-haiku-4-5,+claude-sonnet-4-5,+grok-4-fast,+gemini-3-pro-preview - DEFAULT_MODEL=gpt-5.2 # 因为用了 host 模式,默认是 3000。如果需要改为 3030,必须用环境变量 - PORT=3030 restart: always networks: {} ``` **Cloudflare:** `ai.hxnppll.top` → `localhost:3030` **URL**: `localhost:3030` - *注:这里填 localhost 或 127.0.0.1 均可,因为 docker 已配置监听 0.0.0.0。* **访问**: `ai.hxnppll.top` 跑通了 但意义不大 国内的vps通常网络限制很严 不稳定 还不如网页或客户端使用 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/image-b6ba8173.png]] ### 13.Dozzle (实时日志查看器) - **痛点**: 每次看日志都要 `docker logs -f xxx`,很麻烦。 - **作用**: 一个网页,实时展示所有容器的日志,支持搜索、过滤、下载。 **Windows 下载:** ```bash # 拉取镜像 docker pull amir20/dozzle:latest # 导出为 tar 包 docker save -o D:\dozzle.tar amir20/dozzle:latest ``` **VPS 导入**: 把 `dozzle.tar` 上传到 VPS 的 `/opt`。 ``` # 导入 Dozzle 镜像 docker load -i /opt/dozzle.tar ``` **部署配置 (Dockge):** ``` version: "3" services: dozzle: container_name: dozzle image: amir20/dozzle:latest # 关键:强制使用本地导入的镜像 pull_policy: never volumes: # 必须挂载 docker.sock 才能读取日志 - /var/run/docker.sock:/var/run/docker.sock ports: - 8888:8080 restart: unless-stopped network_mode: bridge environment: # 设置登录账号密码,保护日志安全 - DOZZLE_AUTH_USERNAME=wei - DOZZLE_AUTH_PASSWORD=zw200495 networks: {} ``` **Cloudflare:** `log.hxnppll.top` → `localhost:8888` **访问**: `log.hxnppll.top` #### 系统维护增强 (防爆盘配置) 这步非常重要,我们需要修改 Docker 的配置文件。由于你之前可能已经配过镜像源,我们需要**小心地合并**配置。 ##### 1. 修改 `daemon.json` 在 VPS 终端执行编辑命令: ``` nano /etc/docker/daemon.json ``` 将文件内容修改为以下格式(注意 JSON 格式,逗号不能少): ```json { "registry-mirrors": [ "https://docker.1panel.dev", "https://docker.fxxk.dedyn.io", "https://docker.vhx.cloud", "https://registry.dockermirror.com", "https://docker.1panel.live", "https://docker.m.daocloud.io", "https://huecker.io" ], "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } ``` *解释:这表示保留之前的镜像加速,同时限制每个容器的日志文件最大 10MB,最多保留 3 个文件(即每个容器最多占用 30MB 空间)。* 保存退出:按 `Ctrl+O` -> `Enter` -> `Ctrl+X`。 ##### 2. 重启 Docker 生效 **注意:重启 Docker 会导致所有容器短暂离线。** ``` systemctl daemon-reload systemctl restart docker ``` ##### 3. 设置定时清理任务 编辑定时任务: ``` crontab -e ``` 在文件末尾添加一行(每周日凌晨3点清理无用的镜像、缓存和停止的容器): ``` 0 3 * * 0 docker system prune -af --volumes > /dev/null 2>&1 ``` --- ## 服务汇总表 ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449218164-1d3eea0e.png]] ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767449589964-ad9c02ef.png]] ![[2-Learning/03-项目筑基/05-网络与项目/03-再次出发/assets/diagram-1767451024198-58343075.png]] ### VPS 服务 (10.10.10.1) | 域名 | 端口 | 服务 | 作用 | | --- | --- | --- | --- | | docker.hxnppll.top | 5001 | Dockge | 容器管理 | | file.hxnppll.top | 8081 | FileBrowser | 文件管理 | | status.hxnppll.top | 3001 | Uptime Kuma | 系统监控 | | rclone.hxnppll.top | 5572 | Rclone Web | 备份管理 | | home.hxnppll.top | 7575 | Homarr | 个人仪表盘 | | draw.hxnppll.top | 5002 | Excalidraw | 在线画图 | | draw-room.hxnppll.top | 5003 | Excalidraw-room | 实时协作服务器 | | pdf.hxnppll.top | 8087 | Stirling-PDF | PDF 工具 | | tools.hxnppll.top | 8085 | IT-Tools | 开发工具 | | share.hxnppll.top | 3000 | Pingvin | 文件分享 | | chat.hxnppll.top | 3009 | VoceChat | 私人聊天 | | paste.hxnppll.top | 8086 | MicroBin | 剪贴板 | | img.hxnppll.top | 8091 | EasyImage | 图床 | | mark.hxnppll.top | 9090 | Linkding | 书签 | | music.hxnppll.top | 4533 | Navidrome | 音乐管理 | | password.hxnppll.top | 8098 | Vaultwarden | 密码管理 | | ai.hxnppll.top | 3030 | ChatGPT-Next-Web | 网页AI | | log.hxnppll.top | 8888 | Dozzle | 日志管理 | | love.hxnppll.top | 8037 | Nginx | Love 主页 | | resume.hxnppll.top | 8037 | Nginx | 简历页 | ### 家庭主机服务 (10.10.10.2) | 域名 | 端口 | 服务 | 作用 | | --- | --- | --- | --- | | note.hxnppll.top | 37840 | Trilium | 笔记系统 | | alist.hxnppll.top | 5244 | Alist | 文件列表 | | vue.hxnppll.top | 5173 | Vue Dev | 开发环境 | ### 其他主机服务 (10.10.10.3) | 域名 | 端口 | 服务 | 作用 | | --- | --- | --- | --- | | xinnian.hxnppll.top | 37840 | Trilium | 笔记分享 | --- ## 安全建议 ### Cloudflare Access (双重保护) 对敏感服务 (Dockge, FileBrowser) 建议启用: 1. Cloudflare Dash → Zero Trust → Access → Applications 2. Add application → Self-hosted 3. Application domain: `docker.hxnppll.top` 4. Identity providers: One-time PIN 5. Policy: - Action: Allow - Include: Emails → [你的邮箱] **效果**: 即使密码泄露,没有邮箱验证码也无法访问 --- ## 总结 这套方案的核心优势: 1. ✅ **全 Docker 化**: 环境干净,迁移方便 2. ✅ **自动备份**: 数据安全有保障 3. ✅ **Cloudflare 加持**: 免费 SSL,高可用 4. ✅ **资源高效**: 4GB 内存跑 10+ 服务绰绰有余 5. ✅ **易于维护**: 可视化管理,小白友好 记住三个核心原则: - **数据挂载**: 所有容器数据都要挂载到宿主机 - **定时备份**: 每天自动备份到云盘 - **避免高带宽**: NAT VPS 不适合跑影视库和下载器 --- ⬅️ [[09-迁移|迁移]] 🏠 [[00-网络与项目|00-网络与项目]] ➡️ [[11-拓展局域网思路|拓展局域网思路]]